// ==UserScript==
// @name         A营消息中心优化
// @version      1.2
// @description  消息界面一页更多行，未读的有标注。需配合uBlock规则。
// @author       zengyl
// @namespace    https://gitee.com/Zeng_YL
// @updateURL    https://gitee.com/Zeng_YL/scratch_addon/raw/master/A营消息中心优化/userscript.user.js
// @homepage     https://gitee.com/Zeng_YL/scratch_addon/tree/master/A营消息中心优化
// @match        *://*.gitblock.cn/*
// @match        *://*.aerfaying.com/*
// @grant        GM_setValue
// @grant        GM_getValue
// @grant        unsafeWindow
// ==/UserScript==

(function() {

	//一页消息数（常量，用户设置）
	var MsgPageSize = 15;

	//获取用户id
	var getuserid = function() {
		return unsafeWindow?.Blockey?.INIT_DATA?.loggedInUser?.id
			?? unsafeWindow.Blockey?.Utils?.getLoggedInUser()?.id
			?? 0;
	}

	//GM变量的getter、setter
	var storage = {
		set lastMsg(val) {GM_setValue("lastMsg_" + getuserid(), val)},
		get lastMsg() {return GM_getValue("lastMsg_" + getuserid(), 0)},
	}

	//最后的新消息，刷新或URL改变时才刷新，而不是有请求就刷新
	var last = null;
	//劫持pushState，用来检测URL改变
	var _pushState = window.history.pushState;
	window.history.pushState = function() {
		last = null;
		return _pushState.apply(this, arguments);
	}

	//发出前进行一些劫持
	function beforeSend(xhr, options) {
		if (options.url.search("/GetPagedMessages") != -1) { //是对消息请求
			if(last == null) last = storage.lastMsg;
			options.data = options.data.replace(/(?<=pageSize=)8*/, MsgPageSize); //替换每页消息数
			var originalSuccess = options.success; //劫持Success。ajaxCompleted优先级低，因此不使用
			options.success = function(data, textStatus, jqXhr) {
				var thisid = data.pagedMessages.items?.[0]?.id ?? 0; //本次请求最新id
				if(thisid > last) {
					storage.lastMsg = thisid; //更新，保存。但先不刷新，避免看到后面的页就不提示新消息了
				}
				for(let msg of data.pagedMessages.items) { //加入一些类
					msg.content += `*\u200b*{.btmsginfo .msgtype_${msg.type.replace('.', '_')} .msg_new_${msg.id > last}}`;
				}
				originalSuccess.apply(this, arguments); //原方法执行
			}
		}
	}
	$.ajaxSetup({beforeSend: beforeSend}); //默认设置，达到劫持效果

	//获取图标文字，方便css的伪类中content使用var
	var $icon = $("<i></i>").appendTo("body").hide();
	var iconName = ["member", "comment"]; //人员（邀请）、评论（私信）
	var iconStyle = "";
	for(let name of iconName) { // 获取iconName中每个class的图标真实content
		$icon.attr("class", name);
		iconStyle += `--icon_${name}:${window.getComputedStyle($icon.prevObject[0], "::before").content};`;
	}
	$icon.remove();
	$("<style></style>").text(`:root{${iconStyle}}`).appendTo("head"); //存入style

	//点击换页时自动滚动到顶端
	$(document).on("click", ".pagination_wrapper_3OUHc .pagination", function() {
		location.pathname.includes("/My/Messages") &&
			$("html,body").animate({scrollTop: 0}, 300);
	});
})();